A virtual server environment may typically include multiple physical servers accessing a storage system having multiple storage devices for storing client data. Each server may include multiple virtual machines (VMs) that reside and execute on the server. Each VM (sometimes referred to as a virtual server or virtual desktop) may comprise a separate encapsulation or instance of a separate operating system and one or more applications that execute on the server. As such, each VM on a server may have its own operating system and set of applications and function as a self-contained package on the server and multiple operating systems may execute simultaneously on the server.
Each VM on a server may be configured to share the hardware resources of the server. Each server may include a VM monitor module/engine (sometimes referred to as a hypervisor module/engine) that executes on the server to produce and manage the VMs. The VM monitor module/engine (hypervisor) may also virtualize the hardware and/or software resources of the servers for use by the VMs. The operating system of each VM may utilize and communicate with the resources of the server via the VM monitor/hypervisor engine. The virtual server environment may also include a plurality of clients connected with each server for accessing client data stored on the storage system. Each client may connect and interface/interact with a particular VM of a server to access client data of the storage system. From the viewpoint of a client, the VM may comprise a virtual server that appears and behaves as an actual physical server or behaves as an actual desktop machine. For example, a single server may by “virtualized” into 1, 2, 4, 8, or more virtual servers or virtual desktops, each running their own operating systems, and each able to support one or more applications.
A storage system may be configured to allow servers to access its data, for example, to read or write data to the storage system. A server may execute an application that “connects” to the storage system over a computer network such as a shared local area network (LAN), a wide area network (WAN), or a virtual private network (VPN) implemented over a public network such as the Internet. The application may send an access request (read or write request) to the storage system for accessing particular data stored on the storage system. Each server may also include multiple VMs, each VM being used by and connected with a client through a computer network. Each VM may also execute an application for sending read/write requests (received from the connected client) for accessing data on the storage system. The VM applications executing on the server may service the connected clients by receiving the client access requests and submitting the access requests to the storage system for execution.
There are several advantages in implementing VMs on a server. Having multiple VMs on a single server enables multiple clients to use multiple different operating systems executing simultaneously on the single server. Also, multiple VMs executing their own applications may be logically separated and isolated within a server to avoid conflicts or interference between the applications of the different VMs. As each VM is separated and isolated from other VMs, a security issue or application crash in one VM does not affect the other VMs on the same server. Further, VMs may be rapidly cloned and deployed and easily transferred between servers in the virtual server environment.
Virtual server environments are increasingly supporting a larger number of clients/users and VMs in enterprises. As a result, these virtual server environments are becoming increasingly large and complex. This increasing complexity is compounded by the heterogeneity of the different server types, different server manufacturers, different server configurations, and different storage requirements. Manual management techniques have proven to produce high errors and inefficiencies. For example, changes to the virtual server environment, which may happen frequently often due to rapid hardware and software life cycles, take a long time to complete using manual methods, and manual methods have proven to be error-prone.
The complexity of virtual server environments is further complicated by the increasing adoption of networked storage within virtual server environments (as disclosed in commonly-assigned U.S. patent application Ser. No. 12/283,163 filed on Sep. 9, 2008, the contents of which are incorporated herein in its entirety). VMs can rapidly and seamlessly be shifted from one physical server to any other server, and optimally utilize the resources without affecting the applications. Such a virtualization of the servers, and/or virtualization of the storage network environment, allows for efficiency and performance gains to be realized. These gains may be realized in terms of service-level metrics or performance metrics, e.g., storage capacity utilization, server utilization, CPU utilization, data traffic flow load balancing, etc.
In general, the goal of virtual server environment administrators is to maximize overall resource utilization (among all the hardware resources spread across the multiple servers of the virtual server environment) while meeting predetermined application performance goals. As each VM on a server consumes resources and adds to the workload of the server, maximizing resource utilization includes balancing the allocation of VMs to appropriately spread the added workload among the servers while meeting predetermined application performance goals. For example, a high performance, highly resourced server may be capable of hosting and executing 100 VMs, while an older, lower performing server may host only 50 VMs while still meeting the predetermined application performance goals.
The difference in performance of different VM applications executing on different physical servers may be due to a variety of reasons that may be difficult to determine. The performance of a VM application executing on a particular server may be a function of many hardware or software variables of the server, including processor speed, memory size, number and type of network adapters, performance of a storage subsystem, etc. In many virtual server environments, however, there may be a reduction in application performance because too many VMs may be allocated to a lower performing server, while too few VMs may be allocated to another more capable server. As a result, the overall resources of the virtual server environment (spread across the multiple physical servers) are not fully utilized in an efficient manner.
Conventionally, static techniques for allocating VMs to servers have been used. Static techniques may comprise predetermining a specific number of new VMs to be allocated to each physical server in the virtual server environment. Static techniques may also attempt to predict or model the performance of each server to determine how many new VMs to be allocated to each server. For example, based on the performance predictions, it may be predetermined that 150 new VMs be allocated to a first physical server and 50 new VMs be allocated to a second physical server.
Given that the application performance of a server may be a function of many hardware or software variables, the complexity involved in modeling performance of a server may often produce inaccurate performance predictions. As such, typically, once the VMs are allocated to servers and deployed for use by clients, static techniques result in an unbalanced deployment where too many VMs are allocated to a slower performing server and too few VMs are allocated to a faster performing server and often requires VMs to later be migrated among the servers. The complexity involved in modeling performance of a physical server is also increased when application-access requirements to data on a storage system and storage system performance is also taken into account.
Static techniques that allocate predetermined numbers of VMs to particular servers, even those that model server performance and storage system performance, may still typically produce unbalanced allocation of VMs and require later migration of the VMs among the servers. As such, there is a need for an improved method of allocating VMs to servers in a virtual server environment.